package com.blue.base.demo.controller;

import com.blue.base.common.bean.resp.JsonResult;
import com.blue.base.demo.dto.WxUserDecodeBindDto;
import com.blue.base.demo.service.WxAuthService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 小程序授权认证流程说明：
 * 1.调用/auth/code2Session接口判断新老用户
 *  1.1 老用户
 *    1.1.1 查询并返回用户信息到网关层，网关进行二次包装后生成token和用户信息返回给前端[自定义一个sessionId，存储在redis，以便识别客户端]
 *  1.2 新用户
 *    1.2.1 告知前端当前用户在此服务没有注册过的同时，在此项目生成一个没有电话号的新用户，返回一个空用户信息到网关，再到前端
 *    1.2.2 前端发现用户没有注册，就会调起微信的授权接口，即让微信第三方授权，允许使用微信的信息，允许后，前端可以拿到[iv、encryptedData]
 *    1.2.3 前端通过微信登录授权后，调用/auth/bind接口
 *    1.2.4 后台接到绑定请求，判断会话是否存在的同时，去redis缓存取出sessionKey,配合前端传递的[iv,encryptedData],解析用户手机号并更新数据库的临时用户[转正]
 *    1.2.5 前端根据解析的返回结果判断，如果后台做解析、绑定用户成功成功，则前端再次发起对/auth/code2Session接口的调用
 *    【此处为什么解析、绑定用户成功后，后台不直接返回用户登录信息？因为网关对登录接口做了统一的封装，即网关只会对login接口才会进行包装】
 * 注：前端的所有接口调用，都是通过网关层进行调用
 * @author liulei
 * @version 2.0
 */
@Slf4j
@Api(tags = "小程序-微信用户相关接口")
@RestController
@RequestMapping("/auth/")
@RequiredArgsConstructor
public class WxAuthController {
    private final WxAuthService authService;

    /**
     * 调用微信服务器获取openId
     *
     * @param code 临时码code
     * @return session信息
     */
    @GetMapping("code2Session")
    @ApiOperation("判断新老用户")
    public JsonResult<Map<String, Object>> code2Session(@RequestParam String code) {
        return JsonResult.ok(this.authService.code2Session(code));
    }

    /**
     * 解析、绑定用户到HomeHub平台
     */
    @PostMapping("bind")
    @ApiOperation("绑定用户手机号")
    public JsonResult<Boolean> bind(@Validated @RequestBody WxUserDecodeBindDto param) {
        this.authService.bindUser(param);
        return JsonResult.ok(Boolean.TRUE);
    }
}
